﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Generic.Contract;
using Generic.Data.Manager;
using Contract.Business.Entity;
using Contract.Business.Filter;
using DataEntity;

namespace Contract.Data.Manager
{
    //Criado por : Gustavo
    //Data       : 11/26/2011 12:44:45 AM
    public class DMVendaItem : DMGeneric<BEVendaItem, FEVendaItem>
    {
        databaseDataContext dc;

        #region Override

        public override BEVendaItem Salvar(BEVendaItem entidade)
        {
            try
            {
                if (entidade.Codigo > 0)
                    Alterar(entidade);
                else
                    Incluir(entidade);

                return entidade;
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override void Excluir(BEVendaItem entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {
                    DEVendaItem de = dc.DEVendaItems.Single(q => q.Codigo.Equals(entidade.Codigo));

                    dc.DEVendaItems.DeleteOnSubmit(de);

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override BEVendaItem ObterEntidade(int codigo)
        {
            try
            {
                DEVendaItem obj = null;
                using (dc = new databaseDataContext())
                {
                    obj = dc.DEVendaItems.Single(q => q.Codigo.Equals(codigo));
                }

                return obj.ConvertToBE(1);
            }
            catch (Exception)
            {
                throw;
            }
        }

        public override List<BEVendaItem> ObterTodos(FEVendaItem filter)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    var q = from e in dc.DEVendaItems
                            where
                            (
                                (((filter.CodigoProduto != null)
                                && (e.CodigoProduto == filter.CodigoProduto)) || (filter.CodigoProduto == null)) &&

                                (((filter.CodigoProdutoMetade != null)
                                && (e.CodigoProdutoMetade == filter.CodigoProdutoMetade)) || (filter.CodigoProdutoMetade == null)) &&

                                (((filter.ValorUnitario != null)
                                && (e.ValorUnitario == filter.ValorUnitario)) || (filter.ValorUnitario == null)) &&

                                (((filter.ValorTotal != null)
                                && (e.ValorTotal == filter.ValorTotal)) || (filter.ValorTotal == null))
                            )
                            select e;

                    List<DEVendaItem> deVendaItem = q.ToList();

                    List<BEVendaItem> retorno = new List<BEVendaItem>();

                    foreach (DEVendaItem de in deVendaItem)
                        retorno.Add(de.ConvertToBE(1));

                    return retorno;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Métodos Auxiliares

        private int Incluir(BEVendaItem entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    DEVendaItem de = new DEVendaItem();
                    de.ConvertFromBE(entidade);

                    dc.DEVendaItems.InsertOnSubmit(de);

                    dc.SubmitChanges();

                    return de.Codigo;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        private void Alterar(BEVendaItem entidade)
        {
            try
            {
                using (dc = new databaseDataContext())
                {

                    DEVendaItem de = dc.DEVendaItems.Single(q => q.Codigo.Equals(entidade.Codigo));

                    de.CodigoTamanho = entidade.CodigoTamanho;
                    de.ValorUnitario = entidade.ValorUnitario;
                    de.Quantidade = entidade.Quantidade;
                    de.Desconto = entidade.Desconto;
                    de.ValorTotal = entidade.ValorTotal;
                    de.Borda = entidade.Borda;
                    de.TipoBorda = entidade.TipoBorda;
                    de.Cupom = entidade.Cupom;

                    if (!String.IsNullOrEmpty(entidade.Observacao))
                        de.Observacao = entidade.Observacao;
                    else
                        de.Observacao = null;

                    dc.SubmitChanges();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
